1   /************************************************************
2   *                     Copyright                            *
3   * Portions of this software are Copyright (c) 1993 - 2002, *
4   * Chad Z. Hower (Kudzu) and the Indy Pit Crew              *
5   *  - http://www.nevrona.com/Indy/                          *
6   ************************************************************/
7   package org.indy.io;
8   
9   import java.util.Map;
10  
11  import javax.swing.event.EventListenerList;
12  
13  import org.indy.Status;
14  
15  import org.indy.util.IndyUtilities;
16  
17  
18  /***
19   *  A skeleton implementation of {@link IOHandler}. This provides no-ops for
20   *  the non base IO methods of <code>IOHandler</code>, property accessors and mutators and
21   *  listener management for concrete subclasses.
22   *
23   *@author    Owen Green
24   */
25  public abstract class AbstractIOHandler implements IOHandler {
26    /***
27   * The timeout to be used for read operations on this <code>IOHandler</code>.
28   * Initially set to the Indy default value
29   *
30   * @see org.indy.util.IndyUtilities#getDefaultTimeout()
31   */
32    protected int readTimeOut = IndyUtilities.getDefaultTimeout();
33  
34    /***
35   * The maximum line length to be used for read line operations
36   * Initially set to the Indy default value
37   *
38   * @see org.indy.util.IndyUtilities#getDefaultMaxLineLength()
39   */
40    protected int maximumLineLength = IndyUtilities.getDefaultMaxLineLength();
41  
42    /***
43   * Holds a list of interested listeners
44   */
45    protected EventListenerList listenerList = new EventListenerList();
46  
47    /***
48   *  Provides a no-op implementation of <code>AfterAccept()</code>
49   *
50   * @see IOHandler#afterAccept
51   */
52    public void afterAccept() {
53    }
54  
55    /***
56   * Provides a a no-op implementation of <code>close()</code>
57   *
58   * @see IOHandler#close()
59   */
60    public void close() {
61    }
62  
63    /***
64   * A no-op implementation of {@link IOHandler#connectClient(Map,int)}.
65   *
66   * @param parameters The parameters to use for connection
67   * @param timeout The timeout to use for connection
68   * @throws IndyIOException If an IO error ocurrs
69   * @see IOHandler#connectClient(Map,int)
70   */
71    public void connectClient(Map parameters, int timeout)
72                       throws IndyIOException {
73    }
74  
75    /***
76   *  Provides a no-op imlpementaion of <code>open()</code>
77   *
78   * @see IOHandler#open
79   */
80    public void open() {
81    }
82  
83    /***
84   *  Reads a sequence of bytes from the socket, using the
85   *  readTimeOut property, if set, or the Indy default timeout
86   *  otherwise.
87   *
88   *@param  b             An array of bytes to read the data into
89   *@return               The number of bytes actually read
90   *@throws IndyIOException  If an IO error occurs.
91   *@throws PeerDisconnectedException if the remote machine has disconnected
92   *@throws ReadTimedOutException if the read opertaion timed out
93   *@throws NotConnectedException if the socket is not connected
94   *@see read(byte[],int,int,int)
95   */
96    public int read(byte[] b) throws IndyIOException {
97      if (b == null) {
98        throw new NullPointerException();
99      }
100 
101     return read(b, b.length);
102   }
103 
104   /***
105  *  Reads a sequence of bytes from the socket, using the
106  *  readTimeOut property, if set, or the Indy default timeout
107  *  otherwise.
108  *
109  *@param  b             An array of bytes to read the data into
110  *@param  len           The amount of data to read
111  *@return               The number of bytes actually read
112  *@throws IndyIOException  If an IO error occurs.
113  *@throws PeerDisconnectedException if the remote machine has disconnected
114  *@throws ReadTimedOutException if the read opertaion timed out
115  *@throws NotConnectedException if the socket is not connected
116  *@see read(byte[],int,int,int)
117  */
118   public int read(byte[] b, int len) throws IndyIOException, 
119                                             ReadTimedOutException {
120     return read(b, 0, len);
121   }
122 
123   /***
124  *  Reads a sequence of bytes from the socket, using the
125  *  readTimeOut property, if set, or the Indy default timeout
126  *  otherwise.
127  *
128  *@param  b             An array of bytes to read the data into
129  *@param off            The offset at which to start writing to <code>b</code>
130  *@param  len           The amount of data to read
131  *@return               The number of bytes actually read
132  *@throws IndyIOException  If an IO error occurs.
133  *@throws PeerDisconnectedException if the remote machine has disconnected
134  *@throws ReadTimedOutException if the read opertaion timed out
135  *@throws NotConnectedException if the socket is not connected
136  *@see read(byte[],int,int,int)
137  */
138   public int read(byte[] b, int off, int len) throws IndyIOException, 
139                                                      ReadTimedOutException {
140     return read(b, off, len, readTimeOut);
141   }
142 
143   /***
144  * Reads a line of text from the socket using the
145  * <code>maximumLineLength</code> and <code>readTimeOut</code>
146  * properties.
147  *
148  * @return A line of data from the socket
149  * @throws IndyIOException if an IO error occurs
150  * @throws PeerDisconnectedException if the remote machine disconnects normally
151  * @throws ReadTimedOutException if the operation times out
152  * @throws MaxLineLengthExceededException if the maximum line length is exceeded before a line break is found
153  * @see getReadTimeOut()
154  * @see setReadTimeOut(int,int)
155  * @see getMaximumLineLength()
156  * @see setMaximumLineLength(int)
157  */
158   public String readLine() throws IndyIOException {
159     return readLine(readTimeOut, maximumLineLength);
160   }
161 
162   /***
163  * Reads a line of data from the socket
164  *
165  * @param timeout The timeout to use for this operation
166  * @param maxLineLength The maxiumum line length to accept
167  * @return A line of data from the socket
168  * @throws IndyIOException if an IO error occurs
169  * @throws PeerDisconnectedException if the remote machine disconnects normally
170  * @throws ReadTimedOutException if the operation times out
171  * @throws MaxLineLengthExceededException if the maximum line length is exceeded before a line break is found
172  * @see readLine(int,int,String)
173  */
174   public String readLine(int timeout, int maxLineLength)
175                   throws IndyIOException, PeerDisconnectedException, 
176                          ReadTimedOutException, MaxLineLengthExceededException {
177     return readLine(timeout, maxLineLength, null);
178   }
179 
180   /***
181  * Returns the current timeout for read operations on this <code>IOHandler</code>
182  *
183  * @return The read timeout for this
184  */
185   public int getReadTimeOut() throws IndyIOException {
186     return readTimeOut;
187   }
188 
189   /***
190  * Set the timeout for read operations on this <code>IOHandler</code>
191  *
192  * @param  newTimeout The new timeout value to use
193  * @throws IllegalArgumentException If the <code>newTimeout</code> is < 0
194  */
195   public void setReadTimeOut(int newTimeout) throws IndyIOException {
196     if (newTimeout < 0) {
197       /*** @todo Resource message */
198       throw new IllegalArgumentException();
199     }
200 
201     readTimeOut = newTimeout;
202   }
203 
204   /***
205  * Gets the maximum line length to be used for read line operations
206  *
207  * @return The maximum line length accepted by this <code>IOHandler</code
208  */
209   public int getMaximumLineLength() {
210     return maximumLineLength;
211   }
212 
213   /***
214  * Sets the maximum line length to be acceped by this <code>IOHandler</code>
215  *
216  * @param newMaximumLineLength The new maximum line length
217  * @throws IllegalArgumentException if <code>newMaximumLineLength</code> is < 0
218  */
219   public void setMaximumLineLength(int newMaximumLineLength) {
220     if (newMaximumLineLength < 0) {
221       throw new IllegalArgumentException();
222     }
223 
224     maximumLineLength = newMaximumLineLength;
225   }
226 
227   /***
228  * Add a {@link IOHandlerListener} to receive events from this <code>IOHandler</code>
229  *
230  * @param l The <code>IOHandlerListener</code>
231  * @see removeIOHandlerListener(IOHandlerListener)
232  */
233   public void addIOHandlerListener(IOHandlerListener l) {
234     listenerList.add(IOHandlerListener.class, l);
235   }
236 
237   /***
238  * Remove a {@link IOHandlerListener} from the listener list.
239  *
240  * @param l The <code>IOHandlerListener</code>
241  * @see addIOHandlerListener(IOHandlerListener)
242  */
243   public void removeIOHandlerListener(IOHandlerListener l) {
244     listenerList.remove(IOHandlerListener.class, l);
245   }
246 
247   /***
248  * Fires an onDisconnect event to all registered listeners
249  */
250   protected void doOnDisconnect() {
251     Object[] listeners = listenerList.getListenerList();
252 
253     for (int i = listeners.length - 2; i >= 0; i -= 2) {
254       if (listeners[i] == IOHandlerListener.class) {
255         ((IOHandlerListener) listeners[i + 1]).onDisconnect(this);
256       }
257     }
258   }
259 
260   /***
261  * Fires an onConnect event to all registered listeners
262  */
263   protected void doOnConnect() {
264     Object[] listeners = listenerList.getListenerList();
265 
266     for (int i = listeners.length - 2; i >= 0; i -= 2) {
267       if (listeners[i] == IOHandlerListener.class) {
268         ((IOHandlerListener) listeners[i + 1]).onConnect(this);
269       }
270     }
271   }
272 
273   /***
274  * Fires an OnStatus event to all registered listeners
275  */
276   protected void doStatus(Status s, Object[] args) {
277     Object[] listeners = listenerList.getListenerList();
278 
279     for (int i = listeners.length - 2; i >= 0; i -= 2) {
280       if (listeners[i] == IOHandlerListener.class) {
281         ((IOHandlerListener) listeners[i + 1]).onStatus(this, s, args);
282       }
283     }
284   }
285 }
This page was automatically generated by Maven